home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Src / pptsapd / pptsapd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  8.0 KB  |  412 lines

  1. /* pptsapd.c: pp version of the tsap daemon */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Src/pptsapd/RCS/pptsapd.c,v 6.0 1991/12/18 20:27:31 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Src/pptsapd/RCS/pptsapd.c,v 6.0 1991/12/18 20:27:31 jpo Rel $
  9.  *
  10.  * $Log: pptsapd.c,v $
  11.  * Revision 6.0  1991/12/18  20:27:31  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include <errno.h>
  19. #include <signal.h>
  20. #include "util.h"
  21. #include "chan.h"
  22. #include <varargs.h>
  23. #include <isode/manifest.h>
  24. #include <sys/stat.h>
  25. #include "sys.file.h"
  26. #ifndef X_OK
  27. #define X_OK    1
  28. #endif
  29.  
  30. #include <isode/tpkt.h>
  31.  
  32. #ifdef  TCP
  33. #include <isode/internet.h>
  34. #endif
  35. #ifdef  X25
  36. #include <isode/x25.h>
  37. #endif
  38. #ifdef  CONS
  39. #include <isode/cons.h>
  40. #endif
  41. #ifdef  TP4
  42. #include <isode/tp4.h>
  43. #endif
  44. #include <isode/isoservent.h>
  45. #include <isode/logger.h>
  46. #include <isode/tailor.h>
  47.  
  48. /*   */
  49.  
  50. static int  debug = 1;
  51. static int  nbits = FD_SETSIZE;
  52.  
  53. static char *myname = "pptsapd";
  54.  
  55. #define NTADDRS         FD_SETSIZE
  56.  
  57. static struct TSAPaddr *tz;
  58.  
  59.  
  60. static void    adios (), advise ();
  61.  
  62. static char *getchanpgm ();
  63. static void tsapd ();
  64. static void ts_adios ();
  65. static void ts_advise ();
  66. static void arginit ();
  67. static void envinit ();
  68.  
  69. extern int  errno;
  70. extern char    *pptsapd_addr, *pptailor;
  71. /*   */
  72.  
  73. /* ARGSUSED */
  74.  
  75. main (argc, argv, envp)
  76. int     argc;
  77. char  **argv,
  78.       **envp;
  79. {
  80.     int       vecp;
  81.     char   *vec[4];
  82.     register struct NSAPaddr  *na;
  83.     struct TSAPdisconnect   tds;
  84.     register struct TSAPdisconnect  *td = &tds;
  85.  
  86.     arginit (argc, argv);
  87.     envinit ();
  88.  
  89.     for (na = tz -> ta_addrs; na < &tz->ta_addrs[tz->ta_naddr]; na++) {
  90.         switch (na -> na_type) {
  91.         case NA_TCP:
  92.             advise (LLOG_NOTICE, NULLCP, "listening on TCP %s %d",
  93.                 na2str (na), ntohs (na -> na_port));
  94.             break;
  95.  
  96.         case NA_X25:
  97.             advise (LLOG_NOTICE, NULLCP, "listening on X.25 %s %s",
  98.                 na2str (na),
  99.                 sel2str (na -> na_pid, na -> na_pidlen, 1));
  100.             break;
  101.  
  102.         case NA_BRG:
  103.             advise (LLOG_NOTICE, NULLCP,
  104.                 "listening on X.25 (BRIDGE) %s %s", na2str (na),
  105.                 sel2str (na -> na_pid, na -> na_pidlen, 1));
  106.             break;
  107.  
  108.         case NA_NSAP:
  109.             advise (LLOG_NOTICE, NULLCP, "listening on NS %s",
  110.                 na2str (na));
  111.             break;
  112.  
  113.         default:
  114.             adios (NULLCP, "unknown network type 0x%x", na -> na_type);
  115.             /* NOTREACHED */
  116.         }
  117.     }
  118.     if (tz -> ta_selectlen)
  119.     advise (LLOG_NOTICE, NULLCP, "   %s",
  120.             sel2str (tz -> ta_selector, tz -> ta_selectlen, 1));
  121.     if (TNetListen (tz, td) == NOTOK)
  122.          ts_adios (td, LLOG_EXCEPTIONS, "listen failed");
  123.  
  124.     for (;;) {
  125.     if (TNetAccept (&vecp, vec, 0, NULLFD, NULLFD, NULLFD, NOTOK, td)
  126.         == NOTOK) {
  127.         ts_advise (td, LLOG_EXCEPTIONS, "accept failed");
  128.         continue;
  129.     }
  130.  
  131.     if (vecp <= 0)
  132.         continue;
  133.  
  134.     switch (TNetFork (vecp, vec, td)) {
  135.         case OK:
  136.         tsapd (vecp, vec);
  137.         exit (1);
  138.         /* NOTREACHED */
  139.  
  140.         case NOTOK:
  141.         ts_advise (td, LLOG_EXCEPTIONS, "fork failed");
  142.         default:
  143.         break;
  144.     }
  145.     }
  146. }
  147.  
  148. /*   */
  149.  
  150. static char buffer1[4096];
  151. static char buffer2[32768];
  152.  
  153.  
  154. static void  tsapd (vecp, vec)
  155. int     vecp;
  156. char  **vec;
  157. {
  158.     char    buffer[BUFSIZ];
  159.     char    buf2[BUFSIZ];
  160.     struct TSAPstart   tss;
  161.     register struct TSAPstart *ts = &tss;
  162.     struct TSAPdisconnect   tds;
  163.     register struct TSAPdisconnect  *td = &tds;
  164.     CHAN    *chan;
  165.     char    *program;
  166.  
  167. /* begin UGLY */
  168.     (void) strcpy (buffer1, vec[1]);
  169.     (void) strcpy (buffer2, vec[2]);
  170. /* end UGLY */
  171.  
  172.     if (TInit (vecp, vec, ts, td) == NOTOK) {
  173.     ts_advise (td, LLOG_EXCEPTIONS, "T-CONNECT.INDICATION");
  174.     return;
  175.     }
  176.  
  177.     advise (LLOG_NOTICE, NULLCP,
  178.         "T-CONNECT.INDICATION: <%d, <%s, %s>, <%s, %s>, %d, %d>",
  179.         ts -> ts_sd,
  180.         na2str (ts -> ts_calling.ta_addrs),
  181.         sel2str (ts -> ts_calling.ta_selector,
  182.              ts -> ts_calling.ta_selectlen, 1),
  183.         na2str (ts -> ts_called.ta_addrs),
  184.         sel2str (ts -> ts_called.ta_selector,
  185.              ts -> ts_called.ta_selectlen, 1),
  186.         ts -> ts_expedited, ts -> ts_tsdusize);
  187.  
  188.      if (ts -> ts_called.ta_selectlen == 0) {
  189.     (void) sprintf (buffer, "No TSEL present");
  190.     goto out;
  191.     }
  192.     if ((chan = ch_nm2struct (ts -> ts_called.ta_selector)) == NULL) {
  193.         (void) sprintf (buffer, "PP Service %s not found",
  194.         ts -> ts_called.ta_selector);
  195.     goto out;
  196.     }
  197.     (void) strcpy (buf2, chan -> ch_progname);
  198.     vecp = sstr2arg (buf2, 20, vec, " \t");
  199.     if (vecp <= 0)
  200.         goto out;
  201.     if ((program = getchanpgm (vec[0])) == NULLCP) {
  202.         (void) sprintf (buffer, "Can't locate program %s", vec[0]);
  203.     goto out;
  204.     }
  205.     vec[vecp] = buffer1;
  206.     vec[vecp+1] = buffer2;
  207.     vec[vecp+2] = NULLCP;
  208.     (void) execv (program, vec);
  209.     (void) sprintf (buffer, "unable to exec %s (%d args): %s", program,
  210.          vecp + 2, sys_errname (errno));
  211.     PP_OPER (NULLCP, ("%s", buffer));
  212. out: ;
  213.     advise (LLOG_EXCEPTIONS, NULLCP, "%s", buffer);
  214.     if ((int)strlen (buffer) >= TD_SIZE)
  215.     buffer[0] = NULL;
  216.     (void) TDiscRequest (ts -> ts_sd, buffer, strlen (buffer) + 1, td);
  217.  
  218.     exit (1);
  219. }
  220.  
  221. static char    *getchanpgm (pgm)
  222. char    *pgm;
  223. {
  224.     char    buf[BUFSIZ];
  225.     static char     name[BUFSIZ];
  226.     extern char *cmddfldir, *chndfldir;
  227.  
  228.     getfpath (cmddfldir, chndfldir, buf);
  229.     getfpath (buf, pgm, name);
  230.  
  231.     return name;
  232. }
  233. /*   */
  234.  
  235. static void  ts_adios (td, code, event)
  236. register struct TSAPdisconnect *td;
  237. int    code;
  238. char    *event;
  239. {
  240.     ts_advise (td, code, event);
  241.  
  242.     exit (1);
  243. }
  244.  
  245. static void  ts_advise (td, code, event)
  246. register struct TSAPdisconnect *td;
  247. int     code;
  248. char   *event;
  249. {
  250.     char    buffer[BUFSIZ];
  251.  
  252.     if (td -> td_cc > 0)
  253.     (void) sprintf (buffer, "[%s] %*.*s",
  254.         TErrString (td -> td_reason),
  255.         td -> td_cc, td -> td_cc, td -> td_data);
  256.     else
  257.     (void) sprintf (buffer, "[%s]", TErrString (td -> td_reason));
  258.  
  259.     advise (code, NULLCP, "%s: %s", event, buffer);
  260. }
  261.  
  262. /*   */
  263.  
  264. static void arginit (argc, argv)
  265. int argc;
  266. char **argv;
  267. {
  268.     register char  *ap;
  269.     int opt;
  270.     extern char *optarg;
  271.     extern int optind;
  272.     char *taddr = NULLCP;
  273.  
  274.     if (myname = rindex (*argv, '/'))
  275.     myname++;
  276.     if (myname == NULL || *myname == NULL)
  277.     myname = *argv;
  278.  
  279.     while ((opt = getopt (argc, argv, "c:t:")) != EOF) {
  280.         switch (opt) {
  281.         case 'c':
  282.             taddr = optarg;
  283.             break;
  284.         case 't':
  285.             pptailor = optarg;
  286.             break;
  287.         default:
  288.             adios (NULLCP, "Usage %s [-t tailor] [-c address]");
  289.             break;
  290.         }
  291.     }
  292.     sys_init (myname);
  293.  
  294.     if (taddr == NULLCP)
  295.         taddr = pptsapd_addr;
  296.     if ((tz = str2taddr (taddr)) == NULLTA)
  297.         adios (NULLCP, "Unknown transport address '%s'", taddr);
  298. }
  299.  
  300. static void envinit () {
  301.     int     i,
  302.         sd;
  303.  
  304.     nbits = getdtablesize ();
  305.  
  306.     if (!(debug = isatty (2))) {
  307.     for (i = 0; i < 5; i++) {
  308.         switch (fork ()) {
  309.         case NOTOK: 
  310.             sleep (5);
  311.             continue;
  312.  
  313.         case OK: 
  314.             break;
  315.  
  316.         default: 
  317.             _exit (0);
  318.         }
  319.         break;
  320.     }
  321.  
  322.     (void) chdir ("/");
  323.  
  324.     if ((sd = open ("/dev/null", O_RDWR)) == NOTOK)
  325.         adios ("/dev/null", "unable to read");
  326.     if (sd != 0)
  327.         (void) dup2 (sd, 0), (void) close (sd);
  328.     (void) dup2 (0, 1);
  329.     (void) dup2 (0, 2);
  330.  
  331. #ifdef  TIOCNOTTY
  332.     if ((sd = open ("/dev/tty", O_RDWR)) != NOTOK) {
  333.         (void) ioctl (sd, TIOCNOTTY, NULLCP);
  334.         (void) close (sd);
  335.     }
  336. #else
  337. #ifdef  SYS5
  338.     (void) setpgrp ();
  339.     (void) signal (SIGINT, SIG_IGN);
  340.     (void) signal (SIGQUIT, SIG_IGN);
  341. #endif
  342. #endif
  343.     }
  344.     else
  345.     pp_log_norm -> ll_stat |= LLOGTTY;
  346.  
  347. #ifndef sun             /* damn YP... */
  348.     for (sd = 3; sd < nbits; sd++)
  349.     (void) close (sd);
  350. #endif
  351.  
  352.     (void) signal (SIGPIPE, SIG_IGN);
  353.  
  354.     ll_hdinit (pp_log_norm, myname);
  355.     advise (LLOG_NOTICE, NULLCP, "starting");
  356. }
  357.  
  358. /*     ERRORS */
  359.  
  360. #ifndef lint
  361. static void    adios (va_alist)
  362. va_dcl
  363. {
  364.     va_list ap;
  365.  
  366.     va_start (ap);
  367.  
  368.     _ll_log (pp_log_norm, LLOG_FATAL, ap);
  369.  
  370.     va_end (ap);
  371.  
  372.     _exit (1);
  373. }
  374. #else
  375. /* VARARGS */
  376.  
  377. static void    adios (what, fmt)
  378. char   *what,
  379.        *fmt;
  380. {
  381.     adios (what, fmt);
  382. }
  383. #endif
  384.  
  385.  
  386. #ifndef lint
  387. static void    advise (va_alist)
  388. va_dcl
  389. {
  390.     int     code;
  391.     va_list ap;
  392.  
  393.     va_start (ap);
  394.  
  395.     code = va_arg (ap, int);
  396.  
  397.     _ll_log (pp_log_norm, code, ap);
  398.  
  399.     va_end (ap);
  400. }
  401. #else
  402. /* VARARGS */
  403.  
  404. static void    advise (code, what, fmt)
  405. char   *what,
  406.        *fmt;
  407. int     code;
  408. {
  409.     advise (code, what, fmt);
  410. }
  411. #endif
  412.